]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
environment: Extract transition completion handling into helper function
authorJoan Torres Lopez <joantolo@redhat.com>
Fri, 20 Feb 2026 11:39:39 +0000 (12:39 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Sun, 2 Aug 2026 16:53:57 +0000 (18:53 +0200)
Add _setupTransitionCompletion to centralize started/stopped signal
handling and cleanup logic. Both _easeActor and _easeAnimatableProperty
now use this helper, reducing code duplication and ensuring consistent
behavior. The signal holder is created as a child of sessionSignalHolder
for proper cleanup on session shutdown.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4082>
(cherry picked from commit 3b638993b7456565ec6f60ceb20df39302313d39)

js/ui/environment.js

index 0e0ab2f339e2f5f1ebc2cbe966b4a85fb4b7bcd0..e94831fe93af0ce685d0e9a20b47a5b465dffbb0 100644 (file)
@@ -81,6 +81,25 @@ function _makeEaseCallback(params, cleanup) {
     return {promise, callback};
 }
 
+function _setupTransitionCompletion(transition, callback, prepare) {
+    const signalHolder = new SignalTracker.TransientSignalHolder(sessionSignalHolder);
+
+    const complete = finished => {
+        signalHolder.destroy();
+        callback(finished);
+    };
+
+    if (prepare) {
+        if (transition.delay)
+            transition.connectObject('started', () => prepare(), signalHolder);
+        else
+            prepare();
+    }
+
+    transition.connectObject('stopped', (_, finished) =>
+        complete(finished), signalHolder);
+}
+
 function _makeEasePrepareAndCleanup(duration) {
     if (!duration)
         return {prepare: null, cleanup: null};
@@ -178,19 +197,10 @@ function _easeActor(actor, params) {
 
     const [transition] = transitions;
 
-    if (prepare) {
-        if (transition?.delay)
-            transition.connectObject('started', () => prepare(), sessionSignalHolder);
-        else
-            prepare();
-    }
-
     if (transition) {
-        transition.connectObject('stopped', (t, finished) => {
-            transition.disconnectObject(sessionSignalHolder);
-            callback(finished);
-        }, sessionSignalHolder);
+        _setupTransitionCompletion(transition, callback, prepare);
     } else {
+        prepare?.();
         callback(true);
     }
 
@@ -270,17 +280,8 @@ function _easeAnimatableProperty(animatable, propName, target, params) {
 
     transition.set_to(target);
 
-    if (prepare) {
-        if (transition.delay)
-            transition.connectObject('started', () => prepare(), sessionSignalHolder);
-        else
-            prepare();
-    }
+    _setupTransitionCompletion(transition, callback, prepare);
 
-    transition.connectObject('stopped', (t, finished) => {
-        transition.disconnectObject(sessionSignalHolder);
-        callback(finished);
-    }, sessionSignalHolder);
     return promise;
 }